home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E+,F-,I+,L-,N-,O-,R+,S+,V-}
- {$M 16384,65536,655360}
-
- Program scopy;
-
- Uses
- Dos,
- tpDos,
- sundry,
- Strings;
-
- Type
- buffer_Type = Array[0..65519] of Byte;
- buffptr = ^buffer_Type;
-
- Var
- f1,f2 : File;
- fname1,
- fname2,
- NewFName,
- OldDir : PathStr;
- SRec : SearchRec;
- errorcode : Integer;
- buffer : buffptr;
- Const
- MakeNewName : Boolean = False;
- FilesCopied : Word = 0;
- MaxHeapSize = 65520;
-
- Function IOCheck(stop : Boolean; msg : String): Boolean;
- Var
- error : Integer;
- begin
- error := Ioresult;
- IOCheck := (error = 0);
- if error <> 0 then begin
- Writeln(msg);
- if stop then begin
- ChDir(OldDir);
- halt(error);
- end;
- end;
- end;
-
- Procedure Initialise;
- Var
- temp : String;
- dir : DirStr;
- name : NameStr;
- ext : ExtStr;
- begin
- if MaxAvail < MaxHeapSize then begin
- Writeln('Insufficient memory');
- halt;
- end
- else
- new(buffer);
- {I-} GetDir(0,OldDir); {$I+} if IOCheck(True,'') then;
- Case ParamCount of
- 0: begin
- Writeln('No parameters provided');
- halt;
- end;
- 1: begin
- TempStr := ParamStr(1);
- if not ParsePath(TempStr,fname1,fname2) then begin
- Writeln('Invalid parameter');
- halt;
- end;
- {$I-} ChDir(fname2); {$I+} if IOCheck(True,'') then;
- end;
- 2: begin
- TempStr := ParamStr(1);
- if not ParsePath(TempStr,fname1,fname2) then begin
- Writeln('Invalid parameter');
- halt;
- end
- else
- {$I-} ChDir(fname2); {$I+} if IOCheck(True,'') then;
-
- TempStr := ParamStr(2);
- if not ParsePath(TempStr,fname2,temp) then begin
- Writeln('Invalid parameter');
- halt;
- end;
- FSplit(fname2,dir,name,ext);
- if length(name) <> 0 then
- MakeNewName := True;
- end;
- else begin
- Writeln('too many parameters');
- halt;
- end;
- end; { Case }
- end; { Initialise }
-
- Procedure CopyFiles;
- Var
- result : Word;
-
- Function MakeNewFileName(fn : String): String;
- Var
- temp : String;
- dir : DirStr;
- name : NameStr;
- ext : ExtStr;
- numb : Word;
- begin
- numb := 0;
- FSplit(fn,dir,name,ext);
- Repeat
- inc(numb);
- if numb > 255 then begin
- Writeln('Invalid File name');
- halt(255);
- end;
- ext := copy(Numb2Hex(numb),2,3);
- temp := dir + name + ext;
- Writeln(temp);
- Until not ExistFile(temp);
- MakeNewFileName := temp;
- end; { MakeNewFileName }
-
-
- begin
- FindFirst(fname1,AnyFile,Srec);
- While Doserror = 0 do begin
- if (SRec.attr and $19) = 0 then begin
- if MakeNewName then
- NewFName := fname2
- else
- NewFName := SRec.name;
- if ExistFile(NewFName) then
- NewFName := MakeNewFileName(NewFName);
- {$I-}
- Writeln('Copying ',SRec.name,' > ',NewFName);
- assign(f1,SRec.name);
- reset(f1,1);
- if { =1= } IOCheck(False,'1. Cannot copy '+fname1) then begin
- assign(f2,fname2);
- reWrite(f2,1);
- if IOCheck(False,'2. Cannot copy '+SRec.name) then
- Repeat
- BlockRead(f1,buffer^,MaxHeapSize);
- if IOCheck(False,'3. Cannot copy '+SRec.name) then
- result := 0
- else begin
- BlockWrite(f2,buffer^,result);
- if IOCheck(False,'4. Cannot copy '+NewFName) then
- result := 0;
- end;
- Until result < MaxHeapSize;
- close(f1); close(f2);
- if IOCheck(False,'Error While copying '+SRec.name) then;
- end; { =1= }
- end; { if SRec.attr }
- FindNext(Srec);
- end; { While Doserror = 0 }
- end; { CopyFiles }
-
- begin
- Initialise;
- CopyFiles;
- ChDir(OldDir);
- end.
-